package com.bw.educate.controller;


import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.AppendObjectRequest;
import com.aliyun.oss.model.ObjectMetadata;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bw.educate.common.ResponseResult;
import com.bw.educate.common.auth.MultipartFileParam;
import com.bw.educate.entity.EduCourseSection;
import com.bw.educate.entity.EduRes;
import com.bw.educate.service.IEduResService;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 在线教育-五组
 * @since 2020-08-12
 */
@RestController
@RequestMapping("res")
public class EduResController {

    @Autowired
    private IEduResService eduResService;


    /**
     * @Description:保存
     * @Author: 李闯
     * @Date: 2020/8/18 20:15
     * @return: com.bw.educate.common.ResponseResult
     **/
    @PostMapping("save")
    public ResponseResult addSave(@RequestBody EduRes res){

        ResponseResult result=ResponseResult.SUCCESS();
        try {
            eduResService.save(res);
            result.setMessage("保存成功");
            result.setResult(res.getId());
        }catch (Exception e){
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage("保存失败"+e.toString());
        }

        return result;
    }
    @GetMapping("getvedio/{id}")
    public ResponseResult getvedio(@PathVariable("id")long id){

        ResponseResult result=ResponseResult.SUCCESS();

        try {
            EduRes eduRes = eduResService.getById(id);
            result.setMessage("保存成功");
            result.setResult(eduRes);
        }catch (Exception e){
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage("保存失败"+e.toString());
        }


        return result;
    }



    /**
     * 视频上传接口
     */
    @PostMapping("slicingUpload")
    public ResponseResult fileUpload(MultipartFileParam param, HttpServletRequest request, HttpServletResponse response){
        ResponseResult result = ResponseResult.SUCCESS();
        boolean isMultipart = ServletFileUpload.isMultipartContent(request); //判断前端Form表单格式是否支持文件上传
            if (!isMultipart) {
            result.setSuccess(false);
            result.setCode(30001);
            result.setMessage("表单格式错误");
            return result;
        }
        QueryWrapper<EduRes> queryWrapper = new QueryWrapper<EduRes>(); //判断文件是否上传过
        queryWrapper.eq("FILE_MD5", param.getIdentifier());
        List<EduRes> eduResList = eduResService.list(queryWrapper);
        if (eduResList.size() > 0) {
            //已经上传过
            result.setResult(eduResList.get(0).getId());
            return result;
        }
        try {
            param.setTaskId(param.getIdentifier());
            result.setResult(eduResService.chunkUploadByMappedByteBuffer(param));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 课件上传接口
     */
    @PostMapping("uploadFile")
    public ResponseResult uploadFile(MultipartFile file) {
        return this.uploadUtile(file,"课件");
    }

    @GetMapping("getres/{id}")
    public EduRes findResById(@PathVariable("id") Long id){
        EduRes eduRes = eduResService.getById(id);
        return eduRes;
    }





    public ResponseResult uploadUtile(MultipartFile file,String url) {
        ResponseResult result = ResponseResult.SUCCESS();

        try {
            // Endpoint以杭州为例，其它Region请按实际情况填写。
            String endpoint = "https://oss-cn-beijing.aliyuncs.com";
            // 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录RAM控制台创建RAM账号。
            String accessKeyId = "LTAI4G96XgvtFw4GLTmcQJ5v";
            String accessKeySecret = "SHfhQzADRPAH8bZobaFQLyRvx4mre9";

            // 创建OSSClient实例。
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);


            //1，获取文件后缀
            String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."), file.getOriginalFilename().length());
            //2，重新定义文件名
            String fileName = UUID.randomUUID() + ext;
            //3，将文件复制到对应服务器的路径下

            String bucketName = "chuang-ying";

            // 创建OSSClient实例。

            // 上传文件到指定的存储空间（bucketName）并将其保存为指定的文件名称（objectName）。
            File cfile = new File(file.getOriginalFilename());
            FileUtils.copyInputStreamToFile(file.getInputStream(), cfile);
            ossClient.putObject(bucketName,url+fileName , new FileInputStream(cfile));
            // 会在本地产生临时文件，用完后需要删除
            if (cfile.exists()) {
                cfile.delete();
            }
            // 关闭OSSClient。
            ossClient.shutdown();

            EduRes eduRes = new EduRes();
            eduRes.setCreateTime(new Date());
            eduRes.setExt(ext.substring(1));
            eduRes.setIsEnable(1);
            eduRes.setResType(1);
            eduRes.setResName(file.getOriginalFilename());
            eduRes.setResPath(url+fileName);
            eduRes.setSize(file.getSize());
            eduResService.save(eduRes);
            //4，将文件的存储路径返回给前端
            Map map = new HashMap();
            map.put("id", eduRes.getId());
            result.setResult(map);
        } catch (Exception e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage("上传失败:" + e.toString());
        }
        return result;
    }


















































































    /*@GetMapping("upload")
    public ResponseBody uppload(){
        // Endpoint以杭州为例，其它Region请按实际情况填写。
        String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维，请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = "<yourAccessKeyId>";
        String accessKeySecret = "<yourAccessKeySecret>";

        String content1 = "Hello OSS A \n";
        String content2 = "Hello OSS B \n";
        String content3 = "Hello OSS C \n";

// 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        ObjectMetadata meta = new ObjectMetadata();
// 指定上传的内容类型。
        meta.setContentType("text/plain");

// 通过AppendObjectRequest设置多个参数。
        AppendObjectRequest appendObjectRequest = new AppendObjectRequest("<yourBucketName>", "<yourObjectName>", new ByteArrayInputStream(content1.getBytes()),meta);

// 通过AppendObjectRequest设置单个参数。
// 设置存储空间名称。
//appendObjectRequest.setBucketName("<yourBucketName>");
// 设置文件名称。
//appendObjectRequest.setKey("<yourObjectName>");
// 设置待追加的内容。有两种可选类型：InputStream类型和File类型。这里为InputStream类型。
//appendObjectRequest.setInputStream(new ByteArrayInputStream(content1.getBytes()));
// 设置待追加的内容。有两种可选类型：InputStream类型和File类型。这里为File类型。
//appendObjectRequest.setFile(new File("<yourLocalFile>"));
// 指定文件的元信息，第一次追加时有效。
//appendObjectRequest.setMetadata(meta);

// 第一次追加。
// 设置文件的追加位置。
        appendObjectRequest.setPosition(0L);
        AppendObjectResult appendObjectResult = ossClient.appendObject(appendObjectRequest);
// 文件的64位CRC值。此值根据ECMA-182标准计算得出。
        System.out.println(appendObjectResult.getObjectCRC());

// 第二次追加。
// nextPosition指明下一次请求中应当提供的Position，即文件当前的长度。
        appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
        appendObjectRequest.setInputStream(new ByteArrayInputStream(content2.getBytes()));
        appendObjectResult = ossClient.appendObject(appendObjectRequest);

// 第三次追加。
        appendObjectRequest.setPosition(appendObjectResult.getNextPosition());
        appendObjectRequest.setInputStream(new ByteArrayInputStream(content3.getBytes()));
        appendObjectResult = ossClient.appendObject(appendObjectRequest);

// 关闭OSSClient。
        ossClient.shutdown();
    }*/

}
